#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;
bool G[107][107];
vector<int> M[107];
int haha[107], len;
LL res[107];
int T, n, m, s;
inline bool check(int r) {
	bool flag=false;
	bool* GR=G[r];
	for (int i=1; i<len; ++i) {
		int t=haha[i];
		if (!GR[t] && t!=r) flag=true;
	}
	return flag;
}
void DFS(int r) {
	if (len>s) return;
	haha[len++]=r;
//	cout<<"path: --->"<<endl;
//	for (int i=1; i<len; ++i) cout<<haha[i]<<" ";
//	cout<<endl;
//	cout<<"check: "<<check2()<<endl;
	bool flag=check(r);
	if (flag) {
		--len;
		return;
	}
	res[len-1]++;
	int len1=M[r].size();
	vector<int> &MR=M[r];
	for (int i=0; i<len1; ++i) {
		int t=MR[i];
		if (t>r) {
			DFS(t);
		}
	}
	--len;
}
int main() {
	int u,v;
	cin>>T;
	while (T--) {
		scanf("%d%d%d", &n, &m, &s);
		memset(G, 0, sizeof(G));
		memset(res, 0, sizeof(res));
		for (int i=0; i<107; ++i) M[i].clear();
		len=1;
		for (int i=0; i<m; ++i) {
			scanf("%d%d", &u, &v);
			G[u][v]=true;
			G[v][u]=true;
			if (u<v) M[u].push_back(v);
			else M[v].push_back(u);
		}
		for (int i=1; i<=n; ++i) {
			if (M[i].size()>0)DFS(i);
		}
		cout<<res[s]<<endl;
	}
	return 0;
}
